package models

import (
	"errors"
	"time"

	"github.com/beego/beego/v2/client/orm"
)

// RechargePackage 充值套餐模型
type RechargePackage struct {
	BaseModel
	Name        string  `orm:"size(64)" json:"name"`         // 套餐名称
	Type        int8    `json:"type"`                        // 套餐类型：1:全国通用, 2:单门店
	StoreId     int64   `orm:"index" json:"store_id"`        // 门店ID（单门店充值时使用）
	Amount      float64 `json:"amount"`                      // 充值金额
	GiftAmount  float64 `json:"gift_amount"`                 // 赠送金额
	GiftPoints  int     `json:"gift_points"`                 // 赠送积分
	Description string  `orm:"size(255)" json:"description"` // 套餐描述
	Status      int8    `orm:"default(1)" json:"status"`     // 状态：0:禁用, 1:启用
	SortOrder   int     `orm:"default(0)" json:"sort_order"` // 排序值
}

// TableName 设置表名
func (r *RechargePackage) TableName() string {
	return "ss_recharge_package"
}

// GetRechargePackageById 根据ID获取充值套餐
func GetRechargePackageById(id int64) (*RechargePackage, error) {
	if id <= 0 {
		return nil, errors.New("套餐ID无效")
	}

	o := orm.NewOrm()
	pkg := &RechargePackage{BaseModel: BaseModel{Id: id}}
	err := o.Read(pkg)
	return pkg, err
}

// GetRechargePackageByIdWithFranchise 根据ID获取充值套餐，带加盟商权限验证
func GetRechargePackageByIdWithFranchise(id int64, franchiseId int64) (*RechargePackage, error) {
	if id <= 0 {
		return nil, errors.New("套餐ID无效")
	}

	o := orm.NewOrm()
	qs := o.QueryTable(new(RechargePackage)).Filter("id", id).Filter("is_deleted", 0)

	// 如果是加盟商，则需要验证权限
	if franchiseId > 0 {
		qs = qs.Filter("franchise_id", franchiseId)
	}

	pkg := &RechargePackage{}
	err := qs.One(pkg)
	return pkg, err
}

// GetRechargePackageList 获取充值套餐列表
func GetRechargePackageList(page, pageSize int, filters map[string]interface{}) ([]*RechargePackage, int64, error) {
	o := orm.NewOrm()
	qs := o.QueryTable(new(RechargePackage))

	// 应用过滤条件
	if name, ok := filters["name"].(string); ok && name != "" {
		qs = qs.Filter("name__contains", name)
	}

	if packageType, ok := filters["type"].(int8); ok {
		qs = qs.Filter("type", packageType)
	}

	if storeId, ok := filters["store_id"].(int64); ok && storeId > 0 {
		qs = qs.Filter("store_id", storeId)
	}

	if status, ok := filters["status"].(int8); ok {
		qs = qs.Filter("status", status)
	}

	// 加盟商过滤
	if franchiseId, ok := filters["franchise_id"].(int64); ok && franchiseId > 0 {
		qs = qs.Filter("franchise_id", franchiseId)
	}

	// 排除已删除的记录
	qs = qs.Filter("is_deleted", 0)

	// 获取总数
	total, _ := qs.Count()

	// 分页查询
	var packages []*RechargePackage
	_, err := qs.OrderBy("sort_order", "-id").Limit(pageSize, (page-1)*pageSize).All(&packages)

	return packages, total, err
}

// CreateRechargePackage 创建充值套餐
func CreateRechargePackage(pkg *RechargePackage) (int64, error) {
	if pkg.Name == "" {
		return 0, errors.New("套餐名称不能为空")
	}

	if pkg.Amount <= 0 {
		return 0, errors.New("充值金额必须大于0")
	}

	if pkg.Type != 1 && pkg.Type != 2 {
		return 0, errors.New("套餐类型无效")
	}

	if pkg.Type == 2 && pkg.StoreId <= 0 {
		return 0, errors.New("门店ID无效")
	}

	pkg.BeforeInsert()
	o := orm.NewOrm()
	id, err := o.Insert(pkg)
	return id, err
}

// UpdateRechargePackage 更新充值套餐
func UpdateRechargePackage(pkg *RechargePackage) error {
	if pkg.Id <= 0 {
		return errors.New("套餐ID无效")
	}

	if pkg.Name == "" {
		return errors.New("套餐名称不能为空")
	}

	if pkg.Amount <= 0 {
		return errors.New("充值金额必须大于0")
	}

	if pkg.Type != 1 && pkg.Type != 2 {
		return errors.New("套餐类型无效")
	}

	if pkg.Type == 2 && pkg.StoreId <= 0 {
		return errors.New("门店ID无效")
	}

	pkg.UpdatedAt = time.Now().Unix()
	o := orm.NewOrm()
	_, err := o.Update(pkg)
	return err
}

// DeleteRechargePackage 删除充值套餐
func DeleteRechargePackage(id int64) error {
	if id <= 0 {
		return errors.New("套餐ID无效")
	}

	o := orm.NewOrm()
	pkg := &RechargePackage{BaseModel: BaseModel{Id: id}}
	err := o.Read(pkg)
	if err != nil {
		return err
	}

	pkg.IsDeleted = 1
	pkg.UpdatedAt = time.Now().Unix()
	_, err = o.Update(pkg, "IsDeleted", "UpdatedAt")
	return err
}

// GetRechargePackagesByType 根据类型获取充值套餐列表
func GetRechargePackagesByType(pkgType int8, storeId int64) ([]*RechargePackage, error) {
	o := orm.NewOrm()
	qs := o.QueryTable(new(RechargePackage)).Filter("type", pkgType).Filter("status", 1).Filter("is_deleted", 0)

	// 如果是门店套餐，则需要筛选对应的门店ID
	if pkgType == 2 && storeId > 0 {
		qs = qs.Filter("store_id", storeId)
	}

	var packages []*RechargePackage
	_, err := qs.OrderBy("sort_order", "-id").All(&packages)
	return packages, err
}
